package hr.ctg.domain.action.objekt;

import hr.ctg.domain.model.Mjesto;
import hr.ctg.domain.model.Otok;
import hr.ctg.domain.model.TipObjekta;
import hr.ctg.domain.model.Zupanija;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.StringTokenizer;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.AutoCreate;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.intercept.BypassInterceptors;

@Name("searchParameters")
@Scope(ScopeType.SESSION)
@AutoCreate
public class SearchParameters {
	private Integer brojZvjezdica;
	private boolean internet;
	private boolean klima;
	private Integer kreveti;
	private boolean ljubimci;
	// private Float minCijena;
	private Float maxCijena;
	// private Integer minOsoba;
	// private Integer maxOsoba;
	private Integer osobe;
	private String nazivObjekta;
	private boolean nudizam;
	private Integer ocjena;
	private Integer pomKreveti;
	private boolean posluga;
	private boolean sanCvorovi;
	private boolean sef;
	private Integer sobe;
	private Integer idAutora;
	private String nazivOtoka;
	private String nazivMjesta;

	private boolean prilInvalidima;
	private boolean praonicaRublja;
	private boolean igrDjeca;
	private boolean privez;
	private boolean restoran;
	private boolean parkiraliste;
	private boolean hladnjak;
	private boolean mikrovalna;
	private boolean priborJelo;
	private boolean perilicaSudja;
	private boolean jahanje;
	private boolean telefon;

	private String order;
	private Boolean asc = false;
	private Mjesto mjesto;
	private Mjesto mjestoMap;
	private TipObjekta tipObjekta;
	private TipObjekta tipObjektaMap;
	private Zupanija zupanija;
	private Otok otok;

	public void clear() {
		this.tipObjekta = null;
		this.tipObjektaMap = null;
		this.mjesto = null;
		this.mjestoMap = null;
		this.otok = null;
		this.zupanija = null;
		this.brojZvjezdica = null;
		this.internet = false;
		this.klima = false;
		this.kreveti = null;
		this.ljubimci = false;
		// this.minCijena = null;
		this.maxCijena = null;
		// this.minOsoba = null;
		// this.maxOsoba = null;
		this.osobe = null;
		this.nazivObjekta = null;
		this.nudizam = false;
		this.ocjena = null;
		this.pomKreveti = null;
		this.posluga = false;
		this.sanCvorovi = false;
		this.sef = false;
		this.sobe = null;
		this.idAutora = null;
		this.nazivOtoka = null;
		this.nazivMjesta = null;
		this.order = null;
		this.asc = false;
	}

	public void setBrojZvjezdica(final Integer brojZvjezdica) {
		this.brojZvjezdica = brojZvjezdica;
	}

	public boolean isInternet() {
		return internet;
	}

	public void setInternet(final boolean internet) {
		this.internet = internet;
	}

	public boolean isKlima() {
		return klima;
	}

	public void setKlima(final boolean klima) {
		this.klima = klima;
	}

	public Integer getKreveti() {
		return kreveti;
	}

	public void setKreveti(final Integer kreveti) {
		this.kreveti = kreveti;
	}

	public boolean isLjubimci() {
		return ljubimci;
	}

	public void setLjubimci(final boolean ljubimci) {
		this.ljubimci = ljubimci;
	}

	// public Float getMinCijena() {
	// return minCijena;
	// }
	//
	// public void setMinCijena(final Float minCijena) {
	// this.minCijena = minCijena;
	// }

	public Float getMaxCijena() {
		return maxCijena;
	}

	public void setMaxCijena(final Float maxCijena) {
		this.maxCijena = maxCijena;
	}

	// public Integer getMinOsoba() {
	// return minOsoba;
	// }
	//
	// public void setMinOsoba(final Integer minOsoba) {
	// this.minOsoba = minOsoba;
	// }
	//
	// public Integer getMaxOsoba() {
	// return maxOsoba;
	// }
	//
	// public void setMaxOsoba(final Integer maxOsoba) {
	// this.maxOsoba = maxOsoba;
	// }

	public String getNazivObjekta() {
		return nazivObjekta;
	}

	public void setNazivObjekta(final String nazivObjekta) {
		this.nazivObjekta = nazivObjekta;
	}

	public boolean isNudizam() {
		return nudizam;
	}

	public void setNudizam(final boolean nudizam) {
		this.nudizam = nudizam;
	}

	public Integer getOcjena() {
		return ocjena;
	}

	public void setOcjena(final Integer ocjena) {
		this.ocjena = ocjena;
	}

	public Integer getPomKreveti() {
		return pomKreveti;
	}

	public void setPomKreveti(final Integer pomKreveti) {
		this.pomKreveti = pomKreveti;
	}

	public boolean isPosluga() {
		return posluga;
	}

	public void setPosluga(final boolean posluga) {
		this.posluga = posluga;
	}

	public boolean isSanCvorovi() {
		return sanCvorovi;
	}

	public void setSanCvorovi(final boolean sanCvorovi) {
		this.sanCvorovi = sanCvorovi;
	}

	public boolean isSef() {
		return sef;
	}

	public void setSef(final boolean sef) {
		this.sef = sef;
	}

	public Integer getSobe() {
		return sobe;
	}

	public void setSobe(final Integer sobe) {
		this.sobe = sobe;
	}

	public Integer getIdAutora() {
		return idAutora;
	}

	public void setIdAutora(final Integer idAutora) {
		this.idAutora = idAutora;
	}

	public String getNazivOtoka() {
		return nazivOtoka;
	}

	public void setNazivOtoka(final String nazivOtoka) {
		this.nazivOtoka = nazivOtoka;
	}

	public String getNazivMjesta() {
		return nazivMjesta;
	}

	public void setNazivMjesta(final String nazivMjesta) {
		this.nazivMjesta = nazivMjesta;
	}

	public String getOrder() {
		return order;
	}

	public void setOrder(final String order) {
		this.order = order;
	}

	public boolean isAsc() {
		return asc;
	}

	public void setAsc(final boolean asc) {
		this.asc = asc;
	}

	public Integer getBrojZvjezdica() {
		return brojZvjezdica;
	}

	public Mjesto getMjesto() {
		return mjesto;
	}

	public void setMjesto(final Mjesto mjesto) {
		this.mjesto = mjesto;
	}

	public TipObjekta getTipObjekta() {
		return tipObjekta;
	}

	public void setTipObjekta(final TipObjekta tipObjekta) {
		this.tipObjekta = tipObjekta;
	}

	public Zupanija getZupanija() {
		return zupanija;
	}

	public void setZupanija(final Zupanija zupanija) {
		this.zupanija = zupanija;
	}

	public Otok getOtok() {
		return otok;
	}

	public void setOtok(final Otok otok) {
		this.otok = otok;
	}

	public Mjesto getMjestoMap() {
		return mjestoMap;
	}

	public void setMjestoMap(final Mjesto mjestoMap) {
		this.mjestoMap = mjestoMap;
	}

	public TipObjekta getTipObjektaMap() {
		return tipObjektaMap;
	}

	public void setTipObjektaMap(final TipObjekta tipObjektaMap) {
		this.tipObjektaMap = tipObjektaMap;
	}

	@Name("spConverter")
	@AutoCreate
	@BypassInterceptors
	@org.jboss.seam.annotations.faces.Converter
	public static class SearchParametersConverter implements Converter {

		@Override
		public Object getAsObject(final FacesContext arg0,
				final UIComponent arg1, final String parameters) {
			if (parameters == null) {
				return null;
			}
			final Map<String, String> p = new HashMap<String, String>();
			final Scanner st = new Scanner(parameters).useDelimiter("__");

			while (st.hasNext()) {
				final StringTokenizer st2 = new StringTokenizer(st.next(), "_");
				final String name = st2.nextToken();
				final String value = st2.hasMoreTokens() ? st2.nextToken()
						: null;
				p.put(name, value);
			}
			SearchParameters searchParameters = new SearchParameters();
			if (p.get("idTipaObjekta") != null) {
				searchParameters.setTipObjekta(new TipObjekta(Integer
						.parseInt(p.get("idTipaObjekta"))));
			}
			if (p.get("idMjesta") != null) {
				searchParameters.setMjesto(new Mjesto(Integer.parseInt(p
						.get("idMjesta"))));
			}
			if (p.get("idOtoka") != null) {
				searchParameters.setOtok(new Otok(Integer.parseInt(p
						.get("idOtoka"))));
			}
			if (p.get("idZupanije") != null) {
				searchParameters.setZupanija(new Zupanija(Integer.parseInt(p
						.get("idZupanije"))));
			}
			if (p.get("brojZvjezdica") != null) {
				searchParameters.setBrojZvjezdica(Integer.parseInt(p
						.get("brojZvjezdica")));
			}
			if (p.get("internet") != null) {
				searchParameters.setInternet(true);
			}
			if (p.get("klima") != null) {
				searchParameters.setKlima(true);
			}
			if (p.get("kreveti") != null) {
				searchParameters.setKreveti(Integer.parseInt(p.get("kreveti")));
			}
			if (p.get("ljubimci") != null) {
				searchParameters.setLjubimci(true);
			}
			// if (p.get("minCijena") != null) {
			// sp.setMinCijena(Float.parseFloat(p.get("minCijena")));
			// }
			if (p.get("maxCijena") != null) {
				searchParameters.setMaxCijena(Float.parseFloat(p
						.get("maxCijena")));
			}
			// if (p.get("minOsoba") != null) {
			// sp.setMinOsoba(Integer.parseInt(p.get("minOsoba")));
			// }
			// if (p.get("maxOsoba") != null) {
			// sp.setMaxOsoba(Integer.parseInt(p.get("maxOsoba")));
			// }
			if (p.get("osobe") != null) {
				searchParameters.setOsobe(Integer.parseInt(p.get("osobe")));
			}
			if (p.get("nazivObjekta") != null) {
				searchParameters.setNazivObjekta(p.get("nazivObjekta"));
			}
			if (p.get("nudizam") != null) {
				searchParameters.setNudizam(true);
			}
			if (p.get("ocjena") != null) {
				searchParameters.setOcjena(Integer.parseInt(p.get("ocjena")));
			}
			if (p.get("pomKreveti") != null) {
				searchParameters.setPomKreveti(Integer.parseInt(p
						.get("pomKreveti")));
			}
			if (p.get("posluga") != null) {
				searchParameters.setPosluga(true);
			}
			if (p.get("sanCvorovi") != null) {
				searchParameters.setSanCvorovi(true);
			}
			if (p.get("sef") != null) {
				searchParameters.setSef(true);
			}
			if (p.get("sobe") != null) {
				searchParameters.setSobe(Integer.parseInt(p.get("sobe")));
			}
			if (p.get("idAutora") != null) {
				searchParameters.setIdAutora(Integer
						.parseInt(p.get("idAutora")));
			}
			if (p.get("nazivOtoka") != null) {
				searchParameters.setNazivOtoka(p.get("nazivOtoka"));
			}
			if (p.get("nazivMjesta") != null) {
				searchParameters.setNazivMjesta(p.get("nazivMjesta"));
			}
			if (p.get("order") != null) {
				searchParameters.setOrder(p.get("order"));
			}
			if (p.get("asc") != null) {
				searchParameters.setAsc(true);
			}

			return searchParameters;
		}

		@Override
		public String getAsString(final FacesContext arg0,
				final UIComponent arg1, final Object obj) {
			final StringBuilder sb = new StringBuilder();
			if (obj instanceof SearchParameters) {
				final SearchParameters sp = (SearchParameters) obj;

				if (sp.getTipObjekta() != null) {
					sb.append("idTipaObjekta_"
							+ sp.getTipObjekta().getIdTipaObjekta() + "__");
				}
				if (sp.getTipObjektaMap() != null) {
					sb.append("idTipaObjekta_"
							+ sp.getTipObjektaMap().getIdTipaObjekta() + "__");
				}
				if (sp.getZupanija() != null) {
					sb.append("idZupanije_" + sp.getZupanija().getIdZupanje()
							+ "__");
				}
				if (sp.getMjesto() != null) {
					sb
							.append("idMjesta_" + sp.getMjesto().getIdMjesta()
									+ "__");
				}
				if (sp.getMjestoMap() != null) {
					sb.append("idMjesta_" + sp.getMjestoMap().getIdMjesta()
							+ "__");
				}
				if (sp.getOtok() != null) {
					sb.append("idOtoka_" + sp.getOtok().getIdOtoka() + "__");
				}
				if (sp.getBrojZvjezdica() != null) {
					sb.append("brojZvjezdica_" + sp.getBrojZvjezdica() + "__");
				}
				if (sp.isInternet() != false) {
					sb.append("internet_1,");
				}
				if (sp.isKlima() != false) {
					sb.append("klima_1");
				}
				if (sp.getKreveti() != null) {
					sb.append("kreveti_" + sp.getKreveti() + "__");
				}
				if (sp.isLjubimci() != false) {
					sb.append("ljubimci_1");
				}
				// if (sp.getMinCijena() != null) {
				// sb.append("minCijena_" + sp.getMinCijena() + "__");
				// }
				if (sp.getMaxCijena() != null) {
					sb.append("maxCijena_" + sp.getMaxCijena() + "__");
				}
				// if (sp.getMinOsoba() != null) {
				// sb.append("minOsoba_" + sp.getMinOsoba() + "__");
				// }
				// if (sp.getMaxOsoba() != null) {
				// sb.append("maxOsoba_" + sp.getMaxOsoba() + "__");
				// }
				if (sp.getOsobe() != null) {
					sb.append("osobe_" + sp.getOsobe() + "__");
				}
				if (sp.getNazivObjekta() != null
						&& !sp.getNazivObjekta().equals("")) {
					sb.append("nazivObjekta_" + sp.getNazivObjekta() + "__");
				}
				if (sp.isNudizam() != false) {
					sb.append("nudizam_1,");
				}
				if (sp.getOcjena() != null) {
					sb.append("ocjena_" + sp.getOcjena() + "__");
				}
				if (sp.getPomKreveti() != null) {
					sb.append("pomKreveti_" + sp.getPomKreveti() + "__");
				}
				if (sp.isPosluga() != false) {
					sb.append("posluga_1");
				}
				if (sp.isSanCvorovi() != false) {
					sb.append("sanCvorovi_1");
				}
				if (sp.isSef() != false) {
					sb.append("sef_1");
				}
				if (sp.getSobe() != null) {
					sb.append("sobe_" + sp.getSobe() + "__");
				}
				if (sp.getIdAutora() != null) {
					sb.append("idAutora_" + sp.getIdAutora() + "__");
				}
				if (sp.getNazivOtoka() != null) {
					sb.append("nazivOtoka_" + sp.getNazivOtoka() + "__");
				}
				if (sp.getNazivMjesta() != null) {
					sb.append("nazivMjesta_" + sp.getNazivMjesta() + "__");
				}
				if (sp.getOrder() != null) {
					sb.append("order_" + sp.getOrder() + "__");
				}
				if (sp.isAsc() != false) {
					sb.append("asc_1");
				}
			}
			if (sb.length() > 0) {
				return sb.toString().substring(0, sb.length());
			} else {
				return null;
			}

		}

		@Override
		public String toString() {
			return getAsString(null, null, this);
		}

	}

	public boolean isPrilInvalidima() {
		return prilInvalidima;
	}

	public void setPrilInvalidima(final boolean prilInvalidima) {
		this.prilInvalidima = prilInvalidima;
	}

	public boolean isPraonicaRublja() {
		return praonicaRublja;
	}

	public void setPraonicaRublja(final boolean praonicaRublja) {
		this.praonicaRublja = praonicaRublja;
	}

	public boolean isIgrDjeca() {
		return igrDjeca;
	}

	public void setIgrDjeca(final boolean igrDjeca) {
		this.igrDjeca = igrDjeca;
	}

	public boolean isPrivez() {
		return privez;
	}

	public void setPrivez(final boolean privez) {
		this.privez = privez;
	}

	public boolean isRestoran() {
		return restoran;
	}

	public void setRestoran(final boolean restoran) {
		this.restoran = restoran;
	}

	public boolean isParkiraliste() {
		return parkiraliste;
	}

	public void setParkiraliste(final boolean parkiraliste) {
		this.parkiraliste = parkiraliste;
	}

	public boolean isHladnjak() {
		return hladnjak;
	}

	public void setHladnjak(final boolean hladnjak) {
		this.hladnjak = hladnjak;
	}

	public boolean isMikrovalna() {
		return mikrovalna;
	}

	public void setMikrovalna(final boolean mikrovalna) {
		this.mikrovalna = mikrovalna;
	}

	public boolean isPriborJelo() {
		return priborJelo;
	}

	public void setPriborJelo(final boolean priborJelo) {
		this.priborJelo = priborJelo;
	}

	public boolean isPerilicaSudja() {
		return perilicaSudja;
	}

	public void setPerilicaSudja(final boolean perilicaSudja) {
		this.perilicaSudja = perilicaSudja;
	}

	public boolean isJahanje() {
		return jahanje;
	}

	public void setJahanje(final boolean jahanje) {
		this.jahanje = jahanje;
	}

	public boolean isTelefon() {
		return telefon;
	}

	public void setTelefon(final boolean telefon) {
		this.telefon = telefon;
	}

	public Integer getOsobe() {
		return osobe;
	}

	public void setOsobe(Integer osobe) {
		this.osobe = osobe;
	}

}
